package forkjoin;

import java.util.concurrent.*;

/**
 * ForkJoinTask 是一个抽象类，它还有两个抽象子类：RecurisiveTask和RecurisiveAction。

 * RecurisiveTask代表有返回值的任务。RecursiveTask<T>是泛型类。T是返回值的类型。

 * RecurisiveAction代表没有返回值的任务。
 */
public class ForkTask extends RecursiveTask<Integer> {

    private static final int MAX = 10;
    private int start;
    private int end;

    public ForkTask(int start, int end){
        this.start = start;
        this.end = end;
    }

    protected Integer compute() {
        int sum = 0;
        if((end - start) <= MAX){
            for(int i = start; i<= end; i++){
                sum += i;
            }
        }else{
            int middle = (start + end) / 2;
            ForkTask forkTask1 = new ForkTask(start, middle);
            ForkTask forkTask2 = new ForkTask(middle + 1, end);
            //执行子任务
            //invokeAll()比fork()高效
            invokeAll(forkTask1, forkTask2);
            /*
            forkTask1.fork();
            forkTask2.fork();
            */
            //获取子任务结果
            sum = forkTask1.join() + forkTask2.join();
        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ForkJoinPool pool = new ForkJoinPool(10);
        ForkTask forkTask = new ForkTask(1,100);
        /**
         * ForkJoinPool的submit(ForkJoinTask task) 或 invoke(ForkJoinTask task) 方法来执行指定任务。
         * 其中ForkJoinTask代表一个可以并行、合并的任务。
         */
        //pool.submit(forkTask);
        //Future<Integer> result = pool.submit(forkTask);
        //System.out.println(result.get());
        int sum = pool.invoke(forkTask);
        System.out.println(sum);
    }
}
